<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>前述 | TBlog</title>
    <meta name="description" content="TBlog with vitePress">
    <link rel="stylesheet" href="/interview/assets/style.9156a4ed.css">
    <link rel="modulepreload" href="/interview/assets/Home.b86443e2.js">
    <link rel="modulepreload" href="/interview/assets/app.49accf37.js">
    <link rel="modulepreload" href="/interview/assets/Git_index.md.fb33a92a.lean.js">
    <link rel="modulepreload" href="/interview/assets/app.49accf37.js">
    <link rel="icon" href="/favicon.ico">
    <meta name="twitter:title" content="前述 | TBlog">
    <meta property="og:title" content="前述 | TBlog">
  </head>
  <body>
    <div id="app"><!--[--><div class="theme"><header class="nav-bar" data-v-7161a24b><div class="sidebar-button" data-v-7161a24b><svg class="icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z" class></path></svg></div><a class="nav-bar-title" href="/interview/" aria-label="TBlog, back to home" data-v-7161a24b data-v-4a583abe><!----> TBlog</a><div class="flex-grow" data-v-7161a24b></div><div class="nav" data-v-7161a24b><nav class="nav-links" data-v-7161a24b data-v-15acbf05><!--[--><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="http://101.43.7.188:66" target="_blank" rel="noopener noreferrer" data-v-641633f9>Music <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="http://101.43.7.188:80" target="_blank" rel="noopener noreferrer" data-v-641633f9>CMC <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="https://juejin.cn/user/2163479676978734/posts" target="_blank" rel="noopener noreferrer" data-v-641633f9>掘金 <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="https://gitee.com/tu_zhiwei98" target="_blank" rel="noopener noreferrer" data-v-641633f9>Gitee <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><!--]--><!----><!----></nav></div><!--[--><!--]--></header><aside class="sidebar" data-v-6b49cdcd><nav class="nav-links nav" data-v-6b49cdcd data-v-15acbf05><!--[--><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="http://101.43.7.188:66" target="_blank" rel="noopener noreferrer" data-v-641633f9>Music <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="http://101.43.7.188:80" target="_blank" rel="noopener noreferrer" data-v-641633f9>CMC <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="https://juejin.cn/user/2163479676978734/posts" target="_blank" rel="noopener noreferrer" data-v-641633f9>掘金 <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><div class="item" data-v-15acbf05><div class="nav-link" data-v-15acbf05 data-v-641633f9><a class="item isExternal" href="https://gitee.com/tu_zhiwei98" target="_blank" rel="noopener noreferrer" data-v-641633f9>Gitee <svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15" data-v-641633f9><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div></div><!--]--><!----><!----></nav><!--[--><!--]--><ul class="sidebar-links" data-v-6b49cdcd><!--[--><li class="sidebar-link"><p class="sidebar-link-item">Vue3.2X</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vue/">基本语法&amp;使用</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vue/VueX">VueX4.x</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vue/Router">Router4.x</a><!----></li><li class="sidebar-link"><p class="sidebar-link-item">部分源码解析</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vue/reactive">响应式系统</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vue/source/Watch">Watch</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vue/source/nextTick">nextTick</a><!----></li></ul></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">WebPack</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/WebPack/">基础配置</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/WebPack/optimize">优化方案</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/WebPack/common">常见的Loader以及Plugin</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/WebPack/custom">自定义Loader以及Plugin</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/WebPack/advanced">手写简单的MY_Webpack</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">Javascript</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Javascript/">基本语法</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Javascript/advanced">高级语法</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">TypeScript</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/TypeScript/">基本语法</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/TypeScript/combat">业务实战</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/TypeScript/advanced">高阶使用</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">浏览器相关</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Browser/">基本原理</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Browser/plugin">浏览器插件</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Browser/advanced">深入原理</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">计算机网络</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Network/">计算机网络</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Network/security">前端安全</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">HTML/CSS</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/CSS/">CSS</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/HTML/">HTML</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">Vite2.X</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vite/">基础配置</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Vite/optimize">原理以及优化</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">Node</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Node/">基本知识</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Node/pit">踩坑记录</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">其他前端工具</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item active" href="/interview/Git/">Git</a><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="#git-revert-与-git-reset-的区别">git revert 与 git reset 的区别</a><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="#五、-一些其他问题的解决办法">五、 一些其他问题的解决办法</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="#六、-一些常用的命令">六、 一些常用的命令</a><!----></li></ul></li></ul></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Jenkins/">Jenkins</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/npm/">包管理工具</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">踩坑记录以及经验</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Pit/">踩坑</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/solution/">一些解决方案</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">面经</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Interview/">xxx面试</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Interview/two">xxX面试</a><!----></li></ul></li><li class="sidebar-link"><p class="sidebar-link-item">个人学习历程</p><ul class="sidebar-links"><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Myself/">个人情况说明</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Myself/pre">入行工作前</a><!----></li><li class="sidebar-link"><a class="sidebar-link-item" href="/interview/Myself/one">工作第一年</a><!----></li></ul></li><!--]--></ul><!--[--><!--]--></aside><!-- TODO: make this button accessible --><div class="sidebar-mask"></div><main class="page" data-v-7eddb2c4><div class="container" data-v-7eddb2c4><!--[--><!--]--><div style="position:relative;" class="content" data-v-7eddb2c4><div><p>本建议只针对公司后台系统使用 Gogs 作为代码仓库的项目，因为 Gogs 与 Github 的部分不同特性，所以本建议所述部分问题并不存在于 Github 相关类似操作。</p><h3 id="前述"><a class="header-anchor" href="#前述" aria-hidden="true">#</a> 前述</h3><p>该建议参考自 Git Flow 工作流程，目的为更加方便多人协作开发，减少代码提交时的冲突。 类似的 Git 流程还有 Github Flow 和 Gitlab Flow，<strong>建议有空的时候对其做一些简单了解，以后可以更加灵活地运用在工作中</strong>。 当有了一个整体流程规范的概念之后，再来看本建议的话，能够很清楚知道每一步操作的意义所在。即使抛弃该建议，也能很好的处理各种项目中出现的 Git 问题。<img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613981311889-f9300292-0505-4f50-ae64-bfe7d02ad262.png" alt="img"></p><p>最终想要达到的 flow 模型</p><p>根据以上流程模型，我们出现冲突的点一般是从<code>feat/xx</code>分支合并至<code>dev</code>时出现。 出现冲突时，可以先自己查看<code>dev</code>分支代码的提交记录，分析一下出现冲突的原因所在。理解问题的根源远比单纯地解决这次问题重要，帮助也更大。</p><p>有些冲突产生的原因甚至是因为 Gogs 本身的特性，同样的问题在 Github 上并没有冲突。</p><p>举个 🌰：</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613981105455-e224108c-e7f0-4397-9f50-b82f6f70413b.png" alt="img"></p><p>步骤：</p><ul><li><p>从<code>master</code>上的同节点处切出<code>feat/f1</code>和<code>feat/f2</code>分支</p></li><li><p>两个功能分支分别进行合并<code>dev</code>测试，然后再分别合并<code>master</code>发布</p></li><li><p>之后从<code>master</code>切出<code>feat/f3</code>分支进行开发，再合<code>dev</code>测试</p></li><li><p>此时合并至<code>dev</code>的过程会出现冲突</p></li></ul><p>该冲突在 Github 中并不会产生，但由于 Gogs 本身的特性，会产生这一冲突。</p><h3 id="一、从开发到上正式"><a class="header-anchor" href="#一、从开发到上正式" aria-hidden="true">#</a> 一、从开发到上正式</h3><p>本节将介绍一个从新需求出现到正式发布的整体流程举例，另外，整个流程也试用于一次完整的线上 bug 修复。 默认<code>master</code>和<code>dev</code>分支都是不能直接进行修改操作的。</p><h4 id="_1-1-新功能-bug-修复-分支建立"><a class="header-anchor" href="#_1-1-新功能-bug-修复-分支建立" aria-hidden="true">#</a> 1.1 新功能(bug 修复)分支建立</h4><p>需要开发新需求时，要从<code>master</code>上新切一个功能分支进行工作，原则上一个分支对应一个需求(tapd)，如果有比较小的、影响不大的需求(比如调整一下样式、列的位置等)，可以在某个新功能分支上同时修改。</p><p>基本 git 操作流程如下：</p><ol><li><p>从当前分支切换到<code>master</code>分支：<code>git checkout master</code></p></li><li><p><strong>拉取远程 master 最新代码到本地</strong>：<code>git pull origin master</code></p></li><li><p>切出新的工作分支：<code>git checkout -b feat/xx功能描述</code></p></li></ol><p>需要修复线上 bug 也是这个流程，最后切新分支时对应名字可以命名为：<code>fix/xxx问题</code>，方便分支与功能的对应。</p><ul><li><p><strong>为什么是从最新的</strong><code>**master**</code><strong>而不是</strong><code>**dev**</code><strong>上切新的分支？</strong></p></li><li><p><code>master</code>上新切的每个功能独立，它们的父节点都是线上正常的代码</p></li><li><p>每个功能分支可以独立进行测试，有功能需要紧急上线也不会受其他功能影响(可能比它之前开发的功能还在<code>dev</code>测试)</p></li></ul><h4 id="_1-2-合并新功能-修复-至-dev测试"><a class="header-anchor" href="#_1-2-合并新功能-修复-至-dev测试" aria-hidden="true">#</a> 1.2 合并新功能(修复)至 <code>dev</code>测试</h4><p>当第 1 点中的功能开发完需要测试的时候，需要将功能分支通过<code>pull request</code>合并至 <code>dev</code>。</p><p>git 操作流程如下（假设当前分支为<code>feat/f1</code>）：</p><ol><li>常规操作：<code>git add</code>，<code>git commit</code>（commit 的 change log 建议可以参考一下阮一峰老师的文章，<a href="http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html%EF%BC%8C%E4%B8%8D%E9%9C%80%E8%A6%81%E5%AE%8C%E5%85%A8%E4%B8%80%E6%A0%B7%EF%BC%8C%E5%9C%A8" target="_blank" rel="noopener noreferrer">http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html，不需要完全一样，在</a> type 部分表明一下意思即可，这样会方便自己以及他人在看仓库信息时理解）</li></ol><p>注：以最新 commit 规范为主。</p><ol><li><strong>拉取一下远程 master 的最新代码</strong>：<code>git pull origin master</code></li></ol><ul><li><p>这一步是为了防止别人已经上传也修改过你本次提交修改的文件</p></li><li><p>通过这一步，能够尽早发现冲突，并且解决。</p></li><li><p>即使没有冲突，如果发现别人和你修改了同一个页面，也尽量看一下修改内容，防止出现不应该使用双方修改的问题(有过类似问题)</p></li></ul><ol><li><p>将<code>feat/f1</code>分支推到远程：<code>git push origin feat/f1</code></p></li><li><p>到仓库地址，使用<code>pull request</code>发起<code>feat/f1</code>--&gt;<code>dev</code>的合并请求</p></li></ol><p>提交修复 bug 的测试也是这样。当然，在最后<code>pr</code>到<code>dev</code>的时候可能会有冲突，接下来会讲述冲突解决的过程。</p><p><code>**pull request**</code><strong>图例演示</strong></p><p>1.发起 pr 请求</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613974955582-bf730680-9ba0-482b-a1b4-f7c308b792f4.png#align=left&amp;display=inline&amp;height=348&amp;margin=%5Bobject%20Object%5D&amp;name=step-1.png&amp;originHeight=348&amp;originWidth=1015&amp;size=56378&amp;status=done&amp;style=none&amp;width=1015" alt="img"></p><p>2.选择发起分支及目标分支</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613974965672-e7508ea1-d50b-400f-9cbb-48eb7b6020eb.png#align=left&amp;display=inline&amp;height=929&amp;margin=%5Bobject%20Object%5D&amp;name=step-2.png&amp;originHeight=929&amp;originWidth=1030&amp;size=138818&amp;status=done&amp;style=none&amp;width=1030" alt="img"></p><p>3.进行合并</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613974978992-43838145-8b59-4b7c-8c0e-c62c2c8fcd98.png#align=left&amp;display=inline&amp;height=769&amp;margin=%5Bobject%20Object%5D&amp;name=step-3-1.png&amp;originHeight=769&amp;originWidth=846&amp;size=112473&amp;status=done&amp;style=none&amp;width=846" alt="img"></p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613974989224-a5097a7b-c02a-44a3-b8a7-bd791e4aee85.png#align=left&amp;display=inline&amp;height=587&amp;margin=%5Bobject%20Object%5D&amp;name=step-3-2.png&amp;originHeight=587&amp;originWidth=761&amp;size=63479&amp;status=done&amp;style=none&amp;width=761" alt="img"></p><h4 id="_1-3-合并到dev有冲突的情况"><a class="header-anchor" href="#_1-3-合并到dev有冲突的情况" aria-hidden="true">#</a> 1.3 合并到<code>dev</code>有冲突的情况</h4><p>当 pr 进行到第 4 点的时候，<code>dev</code>上已经有了别人新合并的代码，因此你在合并的过程中可能就有冲突，此时需要解决冲突，流程如下：</p><ol><li><p>切换分支到<code>dev</code>：<code>git checkout dev</code></p></li><li><p><strong>拉取 dev 最新代码</strong>：<code>git pull origin dev</code></p></li><li><p>从<code>dev</code>切出一个新分支，用来解决冲突：<code>git checkout -b resolve/conflict</code></p></li></ol><ul><li>可以与此次合并功能相关，比如添加房卡<code>resolve/添加房卡功能合并的冲突</code></li></ul><ol><li>在<code>resolve/conflict</code>分支上<code>merge</code>功能分支<code>feat/f1</code>：<code>git merge feat/f1 --no-ff</code></li></ol><ul><li><code>--no-ff</code>参数看个人习惯吧，我一般解决冲突合并的时候会先自己大概检查一遍文件变动，再自己 add, commit</li></ul><ol><li>此时可能会提示有冲突文件无法自动合并，也可能帮你自动合并完成。</li></ol><ul><li><p>有冲突：别人修改 a 文件的地方你修改的地方有重合，此时进入 a 文件解决冲突即可。</p></li><li><p>没冲突：别人修改 a 文件的地方和你修改的不一样，被自动合并了，如果为了保险，可以查看一下修改内容。</p></li></ul><ol><li><p>提交代码，<code>push</code>该分支到远程</p></li><li><p>发起<code>resolve/conflict</code> ---&gt; <code>dev</code>的<code>pull request</code></p></li></ol><h4 id="_1-4-功能上正式环境"><a class="header-anchor" href="#_1-4-功能上正式环境" aria-hidden="true">#</a> 1.4 功能上正式环境</h4><p>功能测试完毕需要发布正式，首先可以查看一下<code>dev</code>分支的提交情况，如果当前<code>dev</code>只有你这个功能在测试，且已经测完，可以直接从<code>dev</code>发起到<code>master</code>的合并请求(pull request)，如果有其他功能在测试，则只能从你那个单独功能分支合并到<code>master</code>。流程如下：</p><ol><li><p>切到对应功能分支：<code>git checkout feat/f1</code></p></li><li><p><strong>拉取 master 最新代码</strong>：<code>git pull origin master</code></p></li><li><p>有冲突解决冲突，没冲突就直接 <code>push</code>到远程</p></li><li><p>发起<code>feat/f1</code> ---&gt; <code>master</code> 的合并请求</p></li></ol><p>当然，也可以使用以下流程：</p><ol><li><p>先发起<code>feat/f1</code> -&gt; <code>master</code>的 pr</p></li><li><p>没冲突就直接合并结束，如果有冲突则进行第 3 步</p></li><li><p>按照前面解决冲突的步骤，从<code>master</code>上切解决冲突的分支<code>resolve/xxx功能冲突解决</code></p></li><li><p>重新发起<code>resolve/xxx功能冲突解决</code> -&gt; <code>master</code>的 pr</p></li></ol><p>上下两种流程都是可以的，不同点在于：前者是为了提前发现可能的冲突，后者是先假设没冲突，如果有再解决。</p><h4 id="_1-5-一些注意点"><a class="header-anchor" href="#_1-5-一些注意点" aria-hidden="true">#</a> 1.5 一些注意点</h4><ol><li><p>新功能分支/修复 bug 分支在合并到<code>dev</code>的时候，<strong>一定不要</strong>在本分支上拉取<code>dev</code>的代码，否则就被<code>dev</code>的代码污染了，后面也就不能合并到<code>master</code>上去~╮(╯▽╰)╭</p></li><li><p>每次开新功能或者解决合并到<code>dev</code>的冲突时，<strong>一定要先</strong>把本地的<code>master</code>或者<code>dev</code>更新到最新代码，再切新的分支</p></li><li><p>可能修复 bug 的分支会出现先合并到<code>master</code>紧急发布的情况，但是也记得后面也往<code>dev</code>合一下，方便以后的同学合并的时候少出现冲突~(<em>▽</em>)</p></li><li><p>因为代码管理平台 Gogs 的一些与 Github 不一样的特性，就目前遇到过的问题来看，之中还可能出现一些奇奇怪怪的状况。但是大家都尽量按照流程来的话，出问题的可能性还是能够降低的~</p></li><li><p>通过实际工作来看，功能分支往<code>dev</code>上合并的冲突是出现的最多的，此时稍微耐心点按照前面的解决冲突步骤执行即可。</p></li><li><p>当我们的功能分支、修复分支、解决冲突分支完成它的使命后，可以删掉，避免远程分支杂乱。（如果担心出什么问题，本地的分支可以先暂时保存）</p></li><li><p><strong>建议一个分支只做一次事情，即合并至</strong><code>**master**</code><strong>发布后就删除，即使突然发现有个小问题需要继续修改，仍然从最新</strong><code>**master**</code><strong>新切分支来解决</strong>(由于 Gogs 本身的一些特性，如果不这样做，后续别人会出现冲突 ╮(╯▽╰)╭)</p></li></ol><h3 id="二、-git-stash-命令的使用"><a class="header-anchor" href="#二、-git-stash-命令的使用" aria-hidden="true">#</a> 二、 <code>git stash</code> 命令的使用</h3><p>假设此时正在<code>feat/f1</code>分支开发功能，但是突然接到一个 bug 需要修复，为了保存当前分支的修改，有同学会先进行一次<code>commit</code>作为暂存。之后再切到新的分支去完成 bug 的修复，修复完再切到<code>feat/f1</code>继续功能开发。</p><p>这样虽然能达到暂存更改的目的，但是会把这些不重要的<code>commit</code>信息一起带到仓库里去，看起来 git 提交信息不够具体与明确。</p><p>所以建议可以去了解一下<code>git stash</code>命令，它能帮助我们将当前修改的记录保存在本地，可随时调取，并且不会影响我们的提交信息。这里我列举了一下我自己常用的：</p><ul><li><p><code>git stash list</code> ---- 查看本地暂存的列表</p></li><li><p><code>git stash save &#39;暂存提示信息&#39; -u</code> --- 将当前修改暂存到本地</p></li><li><p><code>-u</code> 参数是指把仓库中暂未追踪(untracked)的文件也进行暂存(比如你新建了一个文件，如果不加 <code>-u</code>命令，这个新文件就不会被暂存)</p></li><li><p><code>git stash apply stash@{num}</code> ---- 应用某一次暂存到当前分支</p></li><li><p><code>num</code>是通过<code>git stash list</code>查看时对应的数字</p></li><li><p><code>git stash drop stash@{num}</code> ---- 删除某一次暂存</p></li><li><p><code>num</code>与上一点中一样</p></li><li><p><code>git stash clear</code> ---- 清空所有暂存，这个使用的时候记得先看一下暂存列表确认一下较好</p></li><li><p>如果你不小心使用命令 <code>git stash drop</code> 掉你要用到的修改记录，这时候不要慌张，千万不要清除命令行内容，在使用这条命令之后会有类似这样的输出：<code>丢弃了 stash@{1}``（53e033a2d02335701cec614d899b005e69a7ec14 </code> 你可以使用 <code>git stash apply 53e033a2d02335701c </code>进行恢复</p></li></ul><h3 id="三、-巧用-rebase-命令合并-commit"><a class="header-anchor" href="#三、-巧用-rebase-命令合并-commit" aria-hidden="true">#</a> 三、 巧用 rebase 命令合并 commit</h3><p>注意：该命令<strong>只能</strong>在你自己的分支操作你自己的提交！！！！！！！！！ 而且，尽量通过规范的操作来避免使用此命令。</p><h4 id="_3-1-为什么需要该命令"><a class="header-anchor" href="#_3-1-为什么需要该命令" aria-hidden="true">#</a> 3.1 为什么需要该命令</h4><p>在做一个较大需求的开发的时候，有时我们会 commit 多次，并且每次 commit 的时间跨度太大。当最后你的功能完成上线时，你的第一次 commit 和最后一次 commit 时间跨度甚至达到 1 个月的长度。</p><p>如果直接这样合并到 master 分支，那么你的所有 commit 会按照时间插入到 master 的现有节点，造成 commit 信息混乱，且无法回退版本。</p><p>因此，需要借助<code>git rebase</code>相关命令，将自己分支上的多次 commit 合并成一次，最后再合并到 master 分支，这样即使发现合并到 master 有问题需要回退，也只是回退这次的 commit 即可。</p><h4 id="_3-2-一个具体的-🌰"><a class="header-anchor" href="#_3-2-一个具体的-🌰" aria-hidden="true">#</a> 3.2 一个具体的 🌰</h4><p>现在仓库有三个分支：master、dev、f1。(取名字的时候顺手取了 dev，这里可以把 dev 当成 f2 分支，也就是一个简单的功能分支 😂)</p><p>dev 和 f1 都是从 master 上的同一个节点切出来的分支，dev 分支进行了两次提交，并且已经合并至 master，f1 进行了四次提交，都还只在自己的<strong>本地分支</strong>上（如果每次都 push 到远程了的话，也可以做，只不过后面会稍微麻烦一步）。</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613976839090-bc24ec6c-97b8-4c94-8c84-b8b6af12aac4.png#align=left&amp;display=inline&amp;height=900&amp;margin=%5Bobject%20Object%5D&amp;name=dev-time.png&amp;originHeight=900&amp;originWidth=1234&amp;size=956084&amp;status=done&amp;style=none&amp;width=1234" alt="img"></p><p>上图为 dev 的 log 信息。</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613976845995-323924ee-b91b-4245-adc0-519def5bd764.png#align=left&amp;display=inline&amp;height=1064&amp;margin=%5Bobject%20Object%5D&amp;name=f1-time.png&amp;originHeight=1064&amp;originWidth=1160&amp;size=1009044&amp;status=done&amp;style=none&amp;width=1160" alt="img"></p><p>上图为 f1 的 log 信息。</p><p>可以看出来，它们的提交时间是交叉的，如果 f1 此时 pull request 到 master，那么 master 分支上的 commit 信息就被混乱了。</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613976854554-76dbb149-518a-430d-af25-808255e2a4ce.png#align=left&amp;display=inline&amp;height=1480&amp;margin=%5Bobject%20Object%5D&amp;name=merge-time.png&amp;originHeight=1480&amp;originWidth=1380&amp;size=1998304&amp;status=done&amp;style=none&amp;width=1380" alt="img"></p><p>上图为直接从 f1 分支 pull request 到 master 的 log 信息。</p><p>接下来将使用 <code>git rebase</code>命令对 commit 信息进行合并。</p><h6 id="step1-找到定位-commit"><a class="header-anchor" href="#step1-找到定位-commit" aria-hidden="true">#</a> step1: 找到定位 commit</h6><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613976860210-f71e8cce-eaab-42d7-b5a1-1fdaa6b4bfc2.png#align=left&amp;display=inline&amp;height=856&amp;margin=%5Bobject%20Object%5D&amp;name=rebase-step1.png&amp;originHeight=856&amp;originWidth=1034&amp;size=936848&amp;status=done&amp;style=none&amp;width=1034" alt="img"></p><p>从上图 log 看出，我们需要把 f1-1，f1-2，f1-3 合并成一次提交，那么 add: b 的这次提交就是我们不需要改变的，即以它的 commitId 作为定位。</p><h6 id="step2-使用-rebase-命令"><a class="header-anchor" href="#step2-使用-rebase-命令" aria-hidden="true">#</a> step2: 使用 rebase 命令</h6><div class="language-"><pre><code>git rebase -i 2e50ceedf62773a04a5
</code></pre></div><ul><li><p>-i : 弹出交互式的界面进行编辑合并</p></li><li><p>2e50ceedf62773a04a5: 要合并多个版本之前的版本号，注意：该<code>[commitid]</code> 本身不参与合并</p></li></ul><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613976873223-b7768a81-fd75-4809-b883-770ee0979a3f.png#align=left&amp;display=inline&amp;height=1018&amp;margin=%5Bobject%20Object%5D&amp;name=rebase-step2.png&amp;originHeight=1018&amp;originWidth=1230&amp;size=1523080&amp;status=done&amp;style=none&amp;width=1230" alt="img"></p><h6 id="step3-选择需要合并的提交"><a class="header-anchor" href="#step3-选择需要合并的提交" aria-hidden="true">#</a> step3: 选择需要合并的提交</h6><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613976884832-6a4ebc03-8d6c-45db-a565-b9a6928deed5.png#align=left&amp;display=inline&amp;height=892&amp;margin=%5Bobject%20Object%5D&amp;name=rebase-step3.png&amp;originHeight=892&amp;originWidth=1236&amp;size=1247770&amp;status=done&amp;style=none&amp;width=1236" alt="img"></p><p>结合 step2 和 step3 的图，并且结合图中对于每个 command 的解析，pick 是选择该次 commit，然后 s 是指将本次 commit 合并到它的前一次去，并且保留 commit 信息。</p><p>编辑完之后，wq 保存退出（这是 vim 的一些简单命令：i 编辑，ESC 退出编辑，:wq 保存并退出）。</p><h6 id="step4-编辑新的-commit-信息"><a class="header-anchor" href="#step4-编辑新的-commit-信息" aria-hidden="true">#</a> step4: 编辑新的 commit 信息</h6><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613976898143-fa1cd33f-76b8-4b2f-bd20-27285816d6b7.png#align=left&amp;display=inline&amp;height=1038&amp;margin=%5Bobject%20Object%5D&amp;name=rebase-step4.png&amp;originHeight=1038&amp;originWidth=1428&amp;size=1653418&amp;status=done&amp;style=none&amp;width=1428" alt="img"></p><p>这里也就是平时的编辑 commit 信息的地方，我这里注释掉了原来三次 commit 的信息，重新修改为：<code>add: 添加 f 相关的文件</code>。</p><p>修改好后保存退出。</p><h6 id="step5-查看此时的-log-信息"><a class="header-anchor" href="#step5-查看此时的-log-信息" aria-hidden="true">#</a> step5: 查看此时的 log 信息</h6><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977164810-6b56a77d-05b7-4f57-93b3-2dbc1fe59fb1.png#align=left&amp;display=inline&amp;height=698&amp;margin=%5Bobject%20Object%5D&amp;name=rebase-step5.png&amp;originHeight=698&amp;originWidth=972&amp;size=388925&amp;status=done&amp;style=none&amp;width=972" alt="img"></p><p>对比 step1 中的截图，可以看到已经把 f1 分支上的三次提交合并成了一次，这时候也代表我们关于添加 f 相关的文件功能完成，可以正常 push 到远程，进行 pull request 提测或发布了。</p><p>我在之前提到了我们的多次提交是只在本地进行了 commit，而没有 push 到远程，如果每次 commit 都提交到远程了怎么操作呢？</p><p>前面的 step1 - step5 都是一样的，只是你在进行完 step5 之后，想要 push 的时候，它会报错说当前提交落后了远程，无法提交。 <img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977172131-fd54b7ac-9fab-49c0-a9ae-41f1229ea411.png#align=left&amp;display=inline&amp;height=334&amp;margin=%5Bobject%20Object%5D&amp;name=behind.png&amp;originHeight=334&amp;originWidth=1256&amp;size=662229&amp;status=done&amp;style=none&amp;width=1256" alt="img"></p><p>所以此时就需要强制提交：</p><div class="language-"><pre><code>git push --force
</code></pre></div><p>之后，远程分支的提交信息也会得到修改。</p><p>此时再把 f1 合并到 master ，commit 信息就会比较干净了。 <img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977178823-51a54188-0f27-4734-9a65-a9f8884088a9.png#align=left&amp;display=inline&amp;height=1176&amp;margin=%5Bobject%20Object%5D&amp;name=new-time.png&amp;originHeight=1176&amp;originWidth=1136&amp;size=1020128&amp;status=done&amp;style=none&amp;width=1136" alt="img"></p><p>如果发现 f1 功能有问题，master 也可以很快进行相应回退。</p><h5 id="最后"><a class="header-anchor" href="#最后" aria-hidden="true">#</a> 最后</h5><p>虽然<code>git rebase</code>命令可以解决这种问题，但因为它的变基操作比较危险，所以是不建议滥用的，<strong>尤其是不能在他人分支或者协作分支上使用！</strong></p><p>对于喜欢使用本地 commit 来暂存当前修改而去做别的功能的用法，个人十分不建议，因此这很容易让 commit 信息的作用变得混乱。</p><p>至于更好地解决这个问题的方法，擅用第六点的 <code>git stash</code> 相关命令真的很有帮助。</p><h3 id="四、-git-revert-的使用"><a class="header-anchor" href="#四、-git-revert-的使用" aria-hidden="true">#</a> 四、 git revert 的使用</h3><p>以下涉及分支的名字举例只是为了方便，并不是实际项目就直接操作 dev 和 master 分支。</p><h4 id="_4-1-问题场景"><a class="header-anchor" href="#_4-1-问题场景" aria-hidden="true">#</a> 4.1 问题场景</h4><p>当我们在<code>dev</code>分支进行了三次单独的提交，分别为修改 a 文件，修改 b 文件，修改 c 文件。并且合并到了<code>master</code>分支（这里举例合并到<code>master</code>是为了增加困难度，也是实际上容易出现的情况，如果没有合并，也一样适用）。 <img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977320640-36f72bfd-1c39-45ab-b39b-acea53a75c44.png#align=left&amp;display=inline&amp;height=690&amp;margin=%5Bobject%20Object%5D&amp;name=8-1-question-scene.png&amp;originHeight=690&amp;originWidth=1244&amp;size=902364&amp;status=done&amp;style=none&amp;width=1244" alt="img"></p><p>这个时候你发现你的修改 b 文件这次提交有问题，要重新修改，甚至取消这一次修改的东西，而不影响 a 文件的修改和 c 文件的修改。</p><p>这个时候，就需要使用 <code>git revert</code>这条命令来帮助你了。</p><h4 id="_4-2-git-revert-的使用过程"><a class="header-anchor" href="#_4-2-git-revert-的使用过程" aria-hidden="true">#</a> 4.2 git revert 的使用过程</h4><p>首先，切到<code>dev</code>分支，查看一下你的 b 文件修改提交的 commit Id 。</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977334839-f8b0dbd0-b2cd-482e-9d65-64470345cacd.png#align=left&amp;display=inline&amp;height=754&amp;margin=%5Bobject%20Object%5D&amp;name=8-2-b-commit-id.png&amp;originHeight=754&amp;originWidth=1136&amp;size=917081&amp;status=done&amp;style=none&amp;width=1136" alt="img"></p><p>接下来需要重置这一次修改：</p><div class="language-"><pre><code>git revert dd39da935800e498eb2
</code></pre></div><p>这个时候如果是用 vscode 查看的话，能看到以下的情况： <img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977337063-88ab8d8e-4862-4a8d-9775-6126253b0f07.png#align=left&amp;display=inline&amp;height=1516&amp;margin=%5Bobject%20Object%5D&amp;name=8-2-revert-scene.png&amp;originHeight=1516&amp;originWidth=1990&amp;size=579764&amp;status=done&amp;style=none&amp;width=1990" alt="img"></p><p>做好相应的修改后，就可以提交了。</p><p>当然，如果你 revert 后有对文件做修改的话，还需要你 add ，然后再 commit 。</p><p>此时查看<code>dev</code>的 log 信息，会如下： <img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977343685-8605f2b4-2c13-41cb-bcfa-a7c7df8fdb8d.png#align=left&amp;display=inline&amp;height=982&amp;margin=%5Bobject%20Object%5D&amp;name=8-2-after-revert.png&amp;originHeight=982&amp;originWidth=1352&amp;size=1645390&amp;status=done&amp;style=none&amp;width=1352" alt="img"></p><p>可以看到 revert 的提交信息，接下来 push 到远程，然后合并到 <code>master</code>，就可以纠正对 b 文件的修改了。</p><p>下图是<code>master</code>分支的：</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/562381/1613977349231-ac825223-2375-45b0-88ab-241820e321b5.png#align=left&amp;display=inline&amp;height=1064&amp;margin=%5Bobject%20Object%5D&amp;name=8-2-after-master.png&amp;originHeight=1064&amp;originWidth=1300&amp;size=1622475&amp;status=done&amp;style=none&amp;width=1300" alt="img"></p><h4 id="_4-3-注意"><a class="header-anchor" href="#_4-3-注意" aria-hidden="true">#</a> 4.3 注意</h4><ul><li><p>以上只是<code>git revert</code>命令最简单的用法，更加高级及酷炫的用法建议自己 google 。</p></li><li><p>请注意<code>git revert</code>和<code>git reset</code>命令的区别。</p></li><li><p><code>git revert</code>是修改某一次提交中出现的问题，它可以保留住有问题那一次提交前后的其他提交。(举例中的 a 修改和 c 修改都还在)</p></li><li><p><code>git reset</code>是重置到某一次提交<strong>之前</strong>。</p></li><li><p><code>git reset (a修改记录的 commit Id)</code>：保留 a 修改的记录，而把它之后的 b 修改和 c 修改都撤销。</p></li><li><h2 id="git-revert-与-git-reset-的区别"><a class="header-anchor" href="#git-revert-与-git-reset-的区别" aria-hidden="true">#</a> <code>git revert</code> 与 <code>git reset</code> 的区别</h2><p><code>git reset</code> 可以回退 Git 的历史记录。例如当前分支有三个记录，并且 HEAD 指向 c 记录：</p><div class="language-"><pre><code>c &lt;- HEAD
b
a
复制代码
</code></pre></div><p>如果我们想回退到 b 记录，只要执行 <code>git reset b</code> 就可以了：</p><div class="language-"><pre><code>b &lt;- HEAD
a
复制代码
</code></pre></div><p>接着使用 <code>git push -f</code> 将回退版本后的分支强制推送到远程仓库，这样本地分支和远程分支就同步了。</p><div class="language-"><pre><code>git push -f
复制代码
</code></pre></div><p><code>git revert</code> 也可以撤销记录，只不过它撤销的记录不会消失，这一点和 <code>git reset</code> 不一样。<code>git reset</code> 撤销的记录就跟消失了一样。</p><p>现在我们用 <code>git revert</code> 来重新演示下刚才的操作：</p><div class="language-"><pre><code>c
b
a
复制代码
</code></pre></div><p>如果我们执行 <code>git revert b</code>，则会在当前分支上再生成一个新的 commit 记录，变成 <code>a b c b&#39;</code>，这个 <code>b&#39;</code> 的状态和记录 <code>b</code> 是一样的。</p><p>也就是说，执行 <code>git reset b</code> 后，当前的分支记录会变成 <code>a b</code>。执行 <code>git revert b</code> 后，当前的分支记录会变成 <code>a b c b&#39;</code>。</p><p>如果你想让别人知道你撤销过记录，就使用 <code>git revert</code>，因为它会留下撤销的记录，否则用 <code>git reset</code>。</p></li></ul><h3 id="五、-一些其他问题的解决办法"><a class="header-anchor" href="#五、-一些其他问题的解决办法" aria-hidden="true">#</a> 五、 一些其他问题的解决办法</h3><ol><li>文件名的大小写修改 git 不敏感(即 <code>index.js</code>改成<code>Index.js</code>的话，git 不会显示有改变)。</li></ol><p>解决办法：终端运行<code>git config core.ignorecase false</code>，把 git 默认的忽略大小写问题改成<code>false</code>。</p><h3 id="六、-一些常用的命令"><a class="header-anchor" href="#六、-一些常用的命令" aria-hidden="true">#</a> 六、 一些常用的命令</h3><ul><li>挑选指定的 commit 进行合并 git cherry-pick 该命令只将最后一个记录合并到 master 封装</li><li>或者使用 git rebase 将分支的其他记录抛弃 然后再合并</li></ul></div></div><footer class="page-footer" data-v-7eddb2c4 data-v-fb8d84c6><div class="edit" data-v-fb8d84c6><div class="edit-link" data-v-fb8d84c6 data-v-1ed99556><!----></div></div><div class="updated" data-v-fb8d84c6><!----></div></footer><div class="next-and-prev-link" data-v-7eddb2c4 data-v-38ede35f><div class="container" data-v-38ede35f><div class="prev" data-v-38ede35f><a class="link" href="/interview/Node/pit" data-v-38ede35f><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" class="icon icon-prev" data-v-38ede35f><path d="M19,11H7.4l5.3-5.3c0.4-0.4,0.4-1,0-1.4s-1-0.4-1.4,0l-7,7c-0.1,0.1-0.2,0.2-0.2,0.3c-0.1,0.2-0.1,0.5,0,0.8c0.1,0.1,0.1,0.2,0.2,0.3l7,7c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3c0.4-0.4,0.4-1,0-1.4L7.4,13H19c0.6,0,1-0.4,1-1S19.6,11,19,11z"></path></svg><span class="text" data-v-38ede35f>踩坑记录</span></a></div><div class="next" data-v-38ede35f><a class="link" href="/interview/Jenkins/" data-v-38ede35f><span class="text" data-v-38ede35f>Jenkins</span><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" class="icon icon-next" data-v-38ede35f><path d="M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"></path></svg></a></div></div></div><!--[--><!--]--></div></main></div><!----><!--]--></div>
    <script>__VP_HASH_MAP__ = JSON.parse("{\"index.md\":\"992e2bc4\",\"css_advanced.md\":\"157298f3\",\"css_index.md\":\"0df1ef28\",\"browser_advanced.md\":\"a7a79457\",\"browser_index.md\":\"9938c247\",\"browser_plugin.md\":\"fd27046d\",\"git_index.md\":\"fb33a92a\",\"html_advanced.md\":\"599ad3d5\",\"html_index.md\":\"c94736b6\",\"interview_index.md\":\"07dc8acc\",\"interview_two.md\":\"0ca812f6\",\"javascript_advanced.md\":\"5c434e6d\",\"javascript_index.md\":\"d996a3fc\",\"jenkins_index.md\":\"3068e232\",\"myself_index.md\":\"340fc837\",\"myself_one.md\":\"31202d59\",\"myself_pre.md\":\"aa93248e\",\"network_index.md\":\"7251e8b9\",\"network_security.md\":\"d11dae3c\",\"node_index.md\":\"e0b22fc7\",\"node_pit.md\":\"a1502c64\",\"npm_index.md\":\"59b033b6\",\"pit_index.md\":\"603d46aa\",\"solution_index.md\":\"987aa705\",\"typescript_advanced.md\":\"431b8bba\",\"typescript_combat.md\":\"60c9a8a2\",\"typescript_index.md\":\"bd88b5a2\",\"vite_index.md\":\"d6838c03\",\"vite_optimize.md\":\"49f1bb24\",\"vue_index.md\":\"380ec221\",\"vue_reactive.md\":\"206c8e46\",\"vue_router.md\":\"0d556c25\",\"vue_source.md\":\"592e192a\",\"vue_vuex.md\":\"032502ef\",\"webpack_advanced.md\":\"ae6c63b7\",\"webpack_common.md\":\"141deb7a\",\"webpack_custom.md\":\"4827ebf8\",\"webpack_index.md\":\"49f185a6\",\"webpack_optimize.md\":\"545698f9\",\"vue_source_index.md\":\"1c12bc29\",\"vue_source_nexttick.md\":\"4533a28b\",\"vue_source_watch.md\":\"0e7342fc\"}")</script>
    <script type="module" async src="/interview/assets/app.49accf37.js"></script>
  </body>
</html>